Пульт.Онлайн /

Скрипты

Возможности
Порядок выполнения
Синтаксис
Переменные Пульт.Онлайн
Функции и операторы
Примеры


Возможности

Сервер и Шлюз Пульт.Онлайн предоставляют возможность выполнения скриптов. Работа со скриптами выполняется на вкладке "Скрипты" в прототипе.

Каждый скрипт представляет собой отдельный сценарий, выполняемый на устройстве с заданной периодичностью или по изменению триггерной переменной.

С помощью скриптов можно изменять значения переменных по определенным условиям и/или вызывать внешние функции, например, для отправки сообщений.


Порядок выполнения

Скрипты в Пульт.Онлайн запускаются периодически или по триггеру. Контекст скрипта (значения локальных переменных) не сохраняется между запусками. Полный цикл выглядит так:

  1. Запуск
  2. Инициализация переменных
  3. Выполнение сценария
  4. Применение изменений
  5. Остановка
Запуск

Инициатором запуска могут выступать следующие события:

  • Период: запуск скрипта осуществляется периодически, через равные промежутки времени.
  • Расписание Cron: запуск скрипта осуществляется периодически, по расписанию в формате Cron.
  • Триггер: запуск скрипта осуществляется только при изменении указанных в качестве триггера переменных.
Инициализация переменных

При запуске скрипта, ему передаются текущие значения используемых в нем переменных Пульт.Онлайн (актуальные значения переменных сервис "script" получает от ядра по подписке). Скрипт создает локальные копии данных переменных и манипулирует данными копиями в процессе выполнения.

Выполнение сценария

В процессе выполнения сценария результаты вычислений применяются только к локальным копиям переменных. Никакие изменения не применяются к переменным Пульт.Онлайн до завершения сценария.

Сценарий не должен содержать бесконечных циклов. Использование таких циклов приведет к аварийной остановке скрипта по таймауту.

Применение изменений

После завершения сценария значения всех измененных переменных отправляются в ядро системы, которое, в свою очередь, рассылает изменения соответствующим драйверам.

Обратите внимание: отправка значения ядру не гарантирует его применения драйвером (значение может не примениться из-за плохой связи с узлом или выходить за допустимые пределы). Таким образом, при следующей итерации скрипта значение соответствующей переменной останется прежним, каким оно было до первого выполнения. Такая же ситуация может возникнуть, если интервал между запусками скрипта выбран слишком коротким и ядро не успевает уведомить сервис о примененном изменении. Другими словами, период запуска скрипта должен быть заведомо выше таймаутов драйвера соответствующей переменной. Минимальный рекомендуемый период - 1000 мс.

Остановка

После отправки изменений ядру системы, контекст скрипта освобождается, значения всех локальных переменных, объявленных оператором let, удаляются. Для сохранения значений промежуточных вычислений между запусками используйте виртуальные переменные Пульт.Онлайн.


Синтаксис

Синтаксис скриптов - ограниченный JavaScript.
Список ограничений следующий:

Нет стандартной библиотеки.
Нет String, Number, RegExp, Date, Function и т.д.
Никаких замыканий, только лексическая область видимости (т. е. разрешены вложенные функции).
Исключений (exceptions) нет.
Нет new. Для того, чтобы создать объект с пользовательским прототипом, используйте Object.create().
Только строгий режим (Strict mode).
Нет var, только let.
Никаких for..of, стрелочных функций, деструкторов, генераторов, прокси, промисов.
Никаких геттеров, сеттеров, valueOf, прототипов, классов, строк шаблонов.
Никаких == или !=, только === и !==.
Строки - это строки байтов, а не строки Юникода: 'ы'.length === 2, 'ы'[0] === '\xd1', 'ы'[1] === '\x8b'.
Строка может представлять любой фрагмент двоичных данных.

Есть математические и специальные функции.
Есть JSON.parse() и JSON.stringify().


Переменные Пульт.Онлайн

Основная задача скриптов - манипуляция переменными Пульт.Онлай, т.е. переменными SCADA-системы.

Имена переменных должны предваряться символом $ и не требуют объявления с помощью оператора let.

Допустимо использование как локальных (в контексте узла) переменных, так и глобальных. Для доступа к переменным того же узла (локальные переменные) указывайте имя переменной, как оно указано в прототипе, например, $var1. Для доступа к переменным других узлов, указывайте имя с префиксом узла, например, $N25_var1. Для доступа к переменным других проектов указывайте имя с префиксом проекта и узла, например, $P3_N25_var1. Префикс можно узнать, кликнув на имени переменной в интерфейсе или в редакторе, в списке переменных узла.

Если статус одной из переменных содержит ошибку, обработка скрипта прекращается с записью об ошибке в логе сервиса "script".

Для переменных доступны суффиксы (через два подчеркивания):

__error - код ошибки переменной
__time - Timestamp (в миллисекундах) последнего изменения статуса переменной
__value - значение (позволяет всегда получать последнее достоверное значение переменной и игнорировать ошибку).

Например:

if($ping__error){
    $offline=1;
}else{
    $offline=0;
}

Примеры

Отправка сообщения в Telegram по флагу:

if($flag_alarm===1){
    $flag_alarm=0;
    let message="Outdoor temperature is "+str($temperature)+" ℃";
    sendTelegram("+71234567890",message);
}

Перезагрузка устройства при отсутствии связи с узлом:

if($ping__error){
    reboot();
}
  Email
  SMS